package com.lotus.minio.service;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.ThreadLocalRandom;

import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import com.lotus.minio.util.MinIOUtil;

@Service
public class MinioService {
	private final MinIOUtil minIOUtil;
	
	// 构造函数注入 MinioUtil，确保服务层与工具类分离
	public MinioService(MinIOUtil minIOUtil) {
		this.minIOUtil = minIOUtil;
	}
	
	
	/**
     * 上传文件到 MinIO
     * @param file 前端上传的文件
     * @return 文件的访问 URL
     * @throws Exception 上传过程中可能抛出的异常
     */
	public String uploadFile(MultipartFile file) throws Exception {
		// 获取文件原始名称
		String originalFilename = file.getOriginalFilename();
		// 生成唯一文件名，避免文件名冲突
        assert originalFilename != null;
        String uniqueFilename = generateUniqueFilename(originalFilename);
		// 获取文件大小
		long fileSize = file.getSize();
		// 设定分片阈值：500MB
		long threshold = 500L * 1024 * 1024; 
		// 动态设置分片大小
		// 大文件分片为 10MB， 小文件不分片
		long partSize = (fileSize > threshold) ? 10L * 1024 * 1024 : -1;		
		
		return minIOUtil.uploadFile(file, uniqueFilename, partSize);
	}

	
	/**
     * 生成唯一文件名
     * @param originalFilename 原始文件名
     * @return 唯一文件名
     */
	private String generateUniqueFilename(String originalFilename) {
		// TODO Auto-generated method stub
		String extension = "";
	    int dotIndex = originalFilename.lastIndexOf('.');
	    String baseName = originalFilename;

	    // 分离扩展名和文件名
	    if (dotIndex > 0) {
	        extension = originalFilename.substring(dotIndex);
	        baseName = originalFilename.substring(0, dotIndex);
	    }

	    // 清理非法字符并标准化文件名
	    String cleanBaseName = baseName
	            .replaceAll("[^a-zA-Z0-9\\u4e00-\\u9fff\\-]", "_") // 保留汉字、字母、数字、连字符
	            .replaceAll("_{2,}", "_");                          // 合并连续下划线
	    
	    // 截短文件名（保留前20个有效字符）
	    if (cleanBaseName.length() > 20) {
	        cleanBaseName = cleanBaseName.substring(0, 20);
	    } else if (cleanBaseName.isEmpty()) {
	        cleanBaseName = "file";  // 兜底处理
	    }

	    // 生成时间戳 (格式：年月日时分秒)
	    String timestamp = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
	    
	    // 生成4位随机码（16进制补零）
	    String randomCode = String.format("%04X", ThreadLocalRandom.current().nextInt(0x10000));

	    // 组合最终文件名
	    return String.format("%s_%s_%s%s", 
	        cleanBaseName, 
	        timestamp, 
	        randomCode, 
	        extension
	    );
	}

}
